home *** CD-ROM | disk | FTP | other *** search
- /*
- IC Install.c
-
- */
-
- #include <Gestalt.h>
- #include <Folders.h>
- #include <Components.h>
-
- #include "IC Types.h"
- #include "IC Component API.h"
- #include "IC Misc Subs.h"
- #include "IC Globals.h"
- #include "IC StandardFile.h"
- #include "IC Dialogs.h"
- #include "IC Subs.h"
- #include "IC API.h"
-
- #include "IC Install.h"
-
- #define registerCmpGlobal 1
- #define registerCmpNoDuplicates 2
- #define registerCmpAfter 4
-
- long application_version,installed_version;
-
- long GetVersionFromResFile(void){
- VersRecHndl versh;
- long ver;
- long* lp;
-
- versh=(VersRecHndl)Get1Resource('vers',1);
- if (versh==(VersRecHndl)0)
- return 0;
-
- lp=(long*)&((*versh)->numericVersion);
- ver=*lp;
- ReleaseResource((Handle)versh);
-
- return ver;
- }
-
- long GetRegisteredVersion(void){
- ComponentInstance inst;
- short refnum,oldref;
- long ver=0L;
-
- if (Has_Components){
- oldref=CurResFile();
-
- inst=OpenDefaultComponent(internetConfigurationComponentType,internetConfigurationComponentSubType);
- if (inst!=(ComponentInstance)0){
- refnum=OpenComponentResFile((Component)inst);
- if (refnum!=-1){
- UseResFile(refnum);
- ver=GetVersionFromResFile();
- CloseComponentResFile(refnum);
- }
- CloseComponent(inst);
- }
-
- UseResFile(oldref);
- }
- return ver;
- }
-
- Boolean IsInstalled(FSSpec* where){
- OSErr err;
- short ndx;
- Boolean found;
- CInfoPBRec cpb;
- FInfo info;
- Str255 tstr;
-
- err=FindFolder(kOnSystemDisk,kExtensionFolderType,kCreateFolder,&where->vRefNum,&where->parID);
- GetAString(tstr,128,12);
-
- SetPString(where->name,1,tstr);
-
- if (err==noErr){
- err=HGetFInfo(where->vRefNum,where->parID,where->name,&info);
- if (err!=noErr){
- found=false;
- ndx=1;
- do {
- cpb.hFileInfo.ioNamePtr=where->name;
- cpb.hFileInfo.ioVRefNum=where->vRefNum;
- cpb.hFileInfo.ioDirID=where->parID;
- cpb.hFileInfo.ioFDirIndex=ndx++;
-
- err=PBGetCatInfoSync(&cpb);
- if (err==noErr)
- found=((cpb.hFileInfo.ioFlFndrInfo.fdType=='thng')&&(cpb.hFileInfo.ioFlFndrInfo.fdCreator==ICcreator));
- } while ((!found)&&(err==noErr));
-
- if (!found){
- SetPString(where->name,1,tstr);
- err=fnfErr;
- }
- }
- }
- return (err==noErr);
- }
-
- void UpdateInstalledVersion(FSSpec* fss){
- short ref;
- OSErr err;
-
- installed_version=0;
- if (IsInstalled(fss)){
- ref=HOpenResFile(fss->vRefNum,fss->parID,fss->name,fsRdPerm);
- err=ResError();
- if (err==noErr){
- UseResFile(ref);
- installed_version=GetVersionFromResFile();
- CloseResFile(ref);
- }
- }
- }
-
- OSErr SaveComponentToFile(FSSpec* fss){
- OSErr err=noErr;
- Handle thng;
- short rref;
- long sz;
-
- rref=128;
-
- // The following bit of code will choose the 'ThNg' resource to use
- // based on the architecture. Simply put, if this runs on a power pc
- // the PPC component will be used; 68k gets the 68k component.
-
- err=Gestalt(gestaltSysArchitecture,&sz);
- if (err==noErr){
- if (BitTst(&sz,31-gestaltPowerPC))
- rref=129;
- }
-
- thng=GetResource('ThNg',rref);
-
- if (thng==(Handle)0)
- err=resNotFound;
- else {
- HNoPurge(thng);
- HCreate(fss->vRefNum,fss->parID,fss->name,ICcreator,'thng');
- err=HOpenRF(fss->vRefNum,fss->parID,fss->name,fsRdWrPerm,&rref);
- if (err==noErr){
- err=SetEOF(rref,GetHandleSize(thng));
- if (err==noErr){
- sz=GetHandleSize(thng);
- FSWrite(rref,&sz,*thng);
- }
- FSClose(rref);
- }
- HPurge(thng);
- ReleaseResource(thng);
- }
- UpdateInstalledVersion(fss); // in case we are installing or saving the init
- return err;
- }
-
- OSErr RegisterFile(FSSpec* fss){
- short ref;
- OSErr err,err2;
- long result;
-
- ref=HOpenResFile(fss->vRefNum,fss->parID,fss->name,fsRdPerm);
- err=ResError();
- if (err==noErr){
- result=RegisterComponentResourceFile(ref,registerCmpGlobal);
- if (result>0)
- err=noErr;
- else
- err=(OSErr)result;
- CloseResFile(ref);
- err2=ResError();
- if (err==noErr)
- err=err2;
- }
-
- return err;
- }
-
- OSErr SaveICComponent(void){
- OSErr err;
- FSSpec fss;
- Str255 prompt;
- Str255 defName;
-
- GetAString(prompt,128,13);
- GetAString(defName,128,12);
-
- err=ICStandardPutFile(prompt,defName,&fss);
- if (err==noErr)
- err=SaveComponentToFile(&fss);
-
- return err;
- }
-
- OSErr JustInstallICComponent(void){
- OSErr err;
- FSSpec where;
-
- UpdateInstalledVersion(&where);
- err=SaveComponentToFile(&where);
- if (err==noErr)
- if (Has_Components)
- err=RegisterFile(&where);
-
- return err;
- }
-
- OSErr InstallICComponent(void){
- OSErr err=noErr;
- FSSpec where;
- Str255 prompt;
- short junk;
- long registered_version=0L;
-
- UpdateInstalledVersion(&where);
- if (installed_version>0){
- if (installed_version<application_version)
- GetAString(prompt,128,17);
- else if (installed_version<application_version)
- GetAString(prompt,128,18);
- else if (installed_version<application_version)
- GetAString(prompt,128,19);
-
- ParamText(prompt,"\p","\p","\p");
- InitCursor();
- if (CautionAlert(145,gCancelModalFilter)!=ok)
- err=userCanceledErr;
- }
- if (err==noErr)
- err=JustInstallICComponent();
- if (err==noErr){
- InitCursor();
- GetAString(prompt,128,20);
- ParamText(prompt,"\p","\p","\p");
- NoteAlert(142,(ModalFilterUPP)0);
- }
-
- return err;
- }
-
- OSErr RemoveICComponent(void){
- OSErr err=noErr;
- FSSpec fss;
-
- UpdateInstalledVersion(&fss);
- if (installed_version>0)
- err=HDelete(fss.vRefNum,fss.parID,fss.name);
- if (err==noErr)
- if (GetRegisteredVersion()>0)
- NoteAlert(144,(ModalFilterUPP)0);
-
- UpdateInstalledVersion(&fss);
- return err;
- }
-
- void AdjustInstallMenu(short menu){
- if (Has_Components)
- SetItemEnable(GetMenuHandle(menu),IM_Install,installed_version<application_version);
- else
- SetItemEnable(GetMenuHandle(menu),IM_Install,false);
- SetItemEnable(GetMenuHandle(menu),IM_Remove,installed_version>0);
- }
-
- void DoInstallMenu(short menu,short item){
- switch (item){
- case IM_Install:
- DisplayError(acInstallComponent,InstallICComponent());
- break;
- case IM_Save:
- DisplayError(acInstallComponent,SaveICComponent());
- break;
- case IM_Remove:
- DisplayError(acRemoveComponent,RemoveICComponent());
- break;
- default:
- break;
- }
- }
-
- OSErr CheckICUsageVersion(void){
- OSErr err,err2;
- ComponentInstance component_instance;
- ICInstance inst;
-
- err=ICMapErr(ICStart(&inst,ICcreator));
- if (err==noErr){
- err=ICMapErr(ICGetComponentInstance(inst,(Ptr*)&component_instance));
- if (err==noErr){
- if ((GetComponentVersion(component_instance)&0xffff0000)<(internetConfigurationComponentInterfaceVersion&0xffff0000))
- err=unimpErr;
- } else
- err=noErr; // we work fine without a component, we just can't deal with an old component
- err2=ICMapErr(ICStop(inst));
- if (err==noErr)
- err=err2;
- }
- return err;
- }
-
- OSErr InitializeComponentInstallation(void){
- FSSpec fss;
- OSErr err=noErr;
- short a;
- Str255 tstr;
- long* lp=(long*)&(app_version.numericVersion);
-
- application_version=*lp;
- UpdateInstalledVersion(&fss);
- if (Has_Components){
- if (installed_version<application_version){
- InitCursor();
- if (installed_version>0){
- a=NoteAlert(146,gCancelModalFilter);
- if (a!=ok)
- err=userCanceledErr;
- } else {
- GetAString(tstr,128,8);
- ParamText(tstr,"\p","\p","\p");
- a=NoteAlert(141,gCancelModalFilter);
- }
-
- if (a==ok){
- err=JustInstallICComponent();
- DisplayError(acInstallComponent,err);
- if (err==noErr){
- err=CheckICUsageVersion();
- if (err==noErr){
- InitCursor();
- GetAString(tstr,128,20);
- ParamText(tstr,"\p","\p","\p");
- a=NoteAlert(142,(ModalFilterUPP)0);
- } else {
- InitCursor();
- GetAString(tstr,128,26);
- ParamText(tstr,"\p","\p","\p");
- a=NoteAlert(142,(ModalFilterUPP)0);
- err=userCanceledErr;
- }
- }
- }
- }
- }
-
- // ensure invariant that we are using the glue, or we are using the current version of the component
- if (err==noErr)
- err=CheckICUsageVersion();
-
- return err;
- }
-